;	PDP-11 FLOATING POINT PACKAGE
;	EMT TRAP HANDLER
;
;	MODULES INCLUDED:
;	1. M.EMT
;
;
;
;
R0	=	%0
R1	=	%1
R2	=	%2
R3	=	%3
R4	=	%4
R5	=	%5
SP	=	%6
PC	=	%7
M.EMT:	BIC	#000017,2(SP)	;CLEAR ALL CONDITION CODES
	TST	-(SP)		;SAVE ROOM FOR DEFA+2
	MOV	R5,-(SP)	;SAVE REGISTERS ON STACK
	MOV	R4,-(SP)
	MOV	R3,-(SP)
	MOV	R2,-(SP)
	MOV	R1,-(SP)
	MOV	R0,-(SP)
	MOV	20(SP),R3	;PICK UP THE STATUS WORD
	BIC	#20,R3		;CLEAR THE T BIT THAT THE ENGINEERS
	MOV	R3,@#177776	;SAW FIT TO IGNORE
	MOV	SP,R3
	MOV	16(SP),R1	;PICK UP USER PC
M.PP3:	MOV	-(R1),R4	;PICK UP TRAP INSTRUCTION
	BIC	#177700,R4	;CALCULATE ADDRESS OF ROUTINE
	ASL	R4		;TO PERFORM THE REQUESTED OPERATION
	CLR	-(SP)		;SET SWITCH FOR CMPF KLUDGE
	CMP	R4,#M.CMPF-M.ATAB; COMPARE OP CODE VS CMPF
	BNE	M.PP6		;BRANCH IF NOT CMPF
	INC	(SP)		;LEAVE A TRAIL
M.PP6:	ADD	PC,R4	
	MOV	M.ATAB-.(R4),R4
	BEQ	M.ERR
	ADD	PC,R4		;RELOCATE POINTER TO ROUTINE
M.PP4:	MOV	R4,-(SP)	;SAVE ADDRESS OF SUBROUTINE
	BEQ	M.ERR1		;OH BOY AN ERROR
	MOV	(R1)+,R4	;FETCH DESTINATION FIELD
	MOV	R1,R5		;MOV USER PC FOR M.ADDR
	BIT	#100,R4		;CHECK FLAVOR BITS FOR FAST FORTRAN
	BNE	M.POL
	BIT	#200,R4		;CHECK FLAVOR BITS FOR FAST ADDRESSING MODE
	BNE	M.FAST
	MOV	(R5)+,R4
	MOV	R4,-(SP)
	ROL	R4
	ROL	R4
	SWAB	R4
	JSR	PC,M.ADDR	;GENERATE SEFA
	MOV	(SP)+,R4	;GET DESTINATION FIELD
	MOV	R0,-(SP)	;SAVE SEFA
	JSR	PC,M.ADDR	;GENERATE DEFA
	MOV	(SP)+,R1	;FETCH SEFA
M.CALL:	MOV	R5,22(SP)	;FIX UP USER PC
	MOV	R0,20(SP)	;SAVE DEFA+2 TO SET INDICATORS LATER
	ADD	#2,20(SP)
	JSR	PC,@(SP)+	;CALL ROUTINE WITH SEFA IN R1 AND DEFA IN R0
	BVS	M.PP2		;TEST FOR OVERFLOW
	MOV	@#177776,R4	;SAVE THE STATUS REGESTER
M.PP5:	TST	(SP)+		;SEE HOW TO SET CONDITION CODES
	BNE	M.CMPE		;IF NON ZERO DO AS A CMP
	MOV	(SP)+,R0	;SAVE REGISTERS
	MOV	(SP)+,R1
	MOV	(SP)+,R2
	MOV	(SP)+,R3
	MOV	(SP)+,R4
	MOV	(SP)+,R5
	BIC	#1,@SP		;MAKE A WORD ADDRESS
	TST	@(SP)+		;SET THE CONDITION CODES
;
;
;DO NOT SET AN ODT BREAK POINT ON THE NEXT INSTRUCTION!!!!
;
;
	BIS	@#177776,2(SP)	;SET THE BITS IN THE USERS STATUS
	RTI
M.PP2:	BIS	#2,22(SP)	;SET OVERFLOW IN USER STATUS
	BR	M.PP5
M.ERR1:	TST	(SP)+		;GET RID OF SUBROURINE ADDRESS
M.ERR:	MOV	#6,R0		;SET ERROR CODE(FATAL)
	JMP	@#40		;AND JUMP TO 40
	RTI
M.CMPE:	BIS	R4,20(SP)	;SET STATUS
	MOV	(SP)+,R0	;RESTORE THE REGISTERS
	MOV	(SP)+,R1
	MOV	(SP)+,R2
	MOV	(SP)+,R3
	MOV	(SP)+,R4
	MOV	(SP)+,R5
	TST	(SP)+
	RTI			;AND RETURN

;FORTRAN POLISH ADDRESSING
;SEFA = (R0)+       DEFA = @R0
M.POL:	MOV	@R3,R1
	MOV	R1,R0
	ADD	#6,R0
	ADD	#6,@R3
	BR	M.CALL

;FAST ADDRESSING MODE
;SEFA = @R1    ,     DEFA = @R0
M.FAST:	MOV	(R3)+,R0	;MOVE USER R0 TO R0
	MOV	(R3)+,R1		;MOVE USER R1 TO R1
	BR	M.CALL		;AND GO CALL SUBROUTINE

;GENERAL ADDRESS FIELD DECODER
;INPUTS: R3-POINTER TO SAVED REGISTERS BLOCK STARTING WITH R0
;	 R4-6 BIT FIELD IN BITS 5-0 TO BE DECODED
;
;OUTPUT: R0-CONTAINS THE EFFECTIVE ADDRESS(EFA) OF THE DECODED FIELD
;DECODER WILL DECODE THE FOLLOWING FIELDS: @R0-R5,(R0-R5)+,-(R0-R5),
;@(R0-R5)+,@-(R0-R5),K(R0-R5),@K(R0-R5),(PC)+,K(PC),@(PC)+,@K(PC)
;IF R6 IS EVER SPECIFIED PC WILL BE USED IN IT'S PLACE
;WHEN THE PC IS USED AS THE REGISTER
; ONLY (PC)+,K(PC),@(PC)+ OR @K(PC) 
;ARE ALLOWED.IF AUTO-INCREMENTING IS NOT SPECIFIED WHEN USING THE PC
;INDEXING IS AUTOMATICALLY ASSUMED.

M.ADDR:	MOV	R4,R2
	CLR	R1
	ROR	R4
	ROR	R4
	ROR	R4
	ROR	R4
	ADC	R1		;INDIRECT BIT IN R1
	BIC	#177774,R4	;ADDRESSING MODE IN R4
	BIC	#177770,R2	;REGISTER NUMBER IN R2
	ASL	R2
	CMP	R2,#14
	BGE	M.AD01		;HANDLE R6-R7 DIFERENTLY
	ADD	R3,R2
	MOV	@R2,R0		;PICK UP THE USERS REGISTER
	CMP	R4,#1
	BEQ	M.M1
	BLO	M.M0		;MODE 0 IS ALL DONE AT THIS POINT
	CMP	R4,#2
	BEQ	M.M2
M.M3:	ADD	(R5)+,R0	;MODE 3 ADDRESSING
	MOV	@R0,R0
M.M3B:	TST	R1
	BEQ	M.M0
	MOV	@R0,R0
M.M0:	RTS	7
M.M2:	SUB	#6,@R2		;MODE 2 ADDRESSING
	SUB	#6,R0
	BR	M.M3B
M.M1:	ADD	#6,@R2		;MODE 1 ADDRESSING
	BR	M.M3B
M.AD01:	MOV	R5,R0
	TST	(R5)+
	CMP	R4,#1
	BEQ	M.M3B
	MOV	@R0,R0
	ADD	R5,R0
	BR	M.M3B
M.ATAB:	.WORD	0         ,ADDF-M.PP4,SUBF-M.PP4,NEGF-M.PP4
	.WORD	MULF-M.PP4,DIVF-M.PP4,NORM-M.PP4,MOVF-M.PP4
M.CMPF:	.WORD	CMPF-M.PP4,FIX -M.PP4,FIXD-M.PP4,FLT -M.PP4
	.WORD	FLTD-M.PP4,ITOA-M.PP4,JTOA-M.PP4,FTOA-M.PP4
	.WORD	ETOA-M.PP4,OTOA-M.PP4,ATOI-M.PP4,ATOF-M.PP4
	.WORD	ATOO-M.PP4,COS -M.PP4,SIN -M.PP4,ATAN-M.PP4
	.WORD	LOG -M.PP4,EXP -M.PP4,SQRT-M.PP4,MUL -M.PP4
	.WORD	DIV -M.PP4,0,0,0
	.WORD	0,0,0,0,0,0,0,0
	.WORD	0,0,0,0,0,0,0,0
	.WORD	0,0,0,0,0,0,0,0
	.WORD	0,0,0,0,0,0,0,0
	.EOT
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                            